package com.unitd.modules.sys.service.impl;

import com.unitd.comm.constant.ToolConstant;
import com.unitd.frame.comm.utils.DateUtils;
import com.unitd.frame.comm.utils.StringUtils;
import com.unitd.frame.mybatis.core.dao.IBaseDao;
import com.unitd.frame.mybatis.core.service.impl.BaseServiceImpl;
import com.unitd.frame.spring.prop.MyPropertyPlaceholderConfigurer;
import com.unitd.frame.sso.common.encrypt.Salt;
import com.unitd.modules.sys.dao.ISysUserDao;
import com.unitd.modules.sys.entity.SysUser;
import com.unitd.modules.sys.service.ISysUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @desc 用户表业务逻辑控制接口实现类
 * @filename SysUserServiceImpl.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017-04-08
 */
@Service("sysUserService")
public class SysUserServiceImpl extends BaseServiceImpl<SysUser, String> implements ISysUserService {

	@Autowired
	private ISysUserDao sysUserDao;

	/**
	 * @return GenericDao实现类
	 * @desc 定义成抽象方法, 由子类实现, 完成dao的注入
	 */
	@Override
	public IBaseDao<SysUser, String> getDao() {
		return sysUserDao;
	}

	/**
	 * @desc 插入之前执行方法, 需要手工调用
	 * @param sysUser 数据保存对象
	 * @param userId 操作人
	 */
	private void preInsert(SysUser sysUser, String userId) {
		sysUser.setId(sysUserDao.getPrePrimaryKey()); 						// 生成ID
		sysUser.setCreateBy(userId);
		sysUser.setCreateDate(DateUtils.formatDate(new Date(), DateUtils.TIMESTAMP_PATTERN));
		// 判断是否需要更改密码(密码为空,则重新赋予默认密码,否则不更新)
		if(StringUtils.isNull(sysUser.getUserPwd())) {
			sysUser.setUserPwd(Salt.md5SaltEncode(sysUser.getUserName(), MyPropertyPlaceholderConfigurer.get("defPwd")));
		}
	}

	/**
	 * @desc 更新之前执行方法，需要手动调用
	 * @param sysUser 数据保存对象
	 * @param userId 操作人
	 */
	private void preUpdate(SysUser sysUser, String userId){
		sysUser.setUpdateBy(userId);
		sysUser.setUpdateDate(DateUtils.formatDate(new Date(), DateUtils.TIMESTAMP_PATTERN));
		// 判断是否需要更改密码(密码为空,则重新赋予默认密码,否则不更新)
		if(StringUtils.isNull(sysUser.getUserPwd())) {
			sysUser.setUserPwd(Salt.md5SaltEncode(sysUser.getUserName(), MyPropertyPlaceholderConfigurer.get("defPwd")));
		}
	}

	/**
	 * @desc 根据主键ID获取对应的详情信息
	 * @param id 主键ID
	 * @return 机构详情
	 */
	@Override
	public SysUser findBy(String id) {
		SysUser sysUser = new SysUser();
		if (!StringUtils.isZero(id)) {
			sysUser = sysUserDao.findBy(id);
		}
		return sysUser;
	}

	/**
	 * @desc 查询指定用户的所有权限
	 * @param userId 用户主键ID
	 * @return 用户权限菜单列表
	 */
//	@Log("根据当前登录用户获取用户权限代码列表")
	@Override
	public List<String> findAllPerms(String userId) {
		return sysUserDao.findAllPerms(userId);
	}

	/**
	 * @desc 查询指定用户的所有菜单ID
	 * @param userId 用户ID
	 * @return 用户权限菜单列表
	 */
//	@Log("根据当前登录用户获取用户权限菜单ID")
	@Override
	public List<String> findAllMenuId(String userId) {
		return sysUserDao.findAllMenuId(userId);
	}

	/**
	 * @desc 根据用户名,查询系统用户
	 * @param userName 用户名称
	 * @return 用户信息
	 */
//	@Log("根据用户名,查询系统用户")
	@Override
	public SysUser findByUserName(String userName) {
		return sysUserDao.findByUserName(userName);
	}

	/**
	 * @desc 根据用户信息,修改用户密码
	 * @param userDataMap 用户信息(主要的key为: userId、password、newPassword)
	 * @return 更新记录条数
	 */
//	@Log("修改用户密码")
	@Override
	public int updatePassword(Map<String, Object> userDataMap) {
		return sysUserDao.updatePassword(userDataMap);
	}

	/**
	 * @desc 根据用户信息, 修改用户最后登录时间
	 * @param userDataMap 用户信息(主要的key为: userId、loginIp)
	 * @return
	 */
	@Override
	public int updateLoginDate(Map<String, Object> userDataMap) {
		return sysUserDao.updateLoginDate(userDataMap);
	}


	/**
	 * @desc 根据选择的机构编号,获取该机构下的用户的最大sort值并+1
	 * @param orgNo 机构No
	 * @return 某机构下的用户最大排序
	 */
	@Override
	public Integer getMaxSortByOrgNo(String orgNo) {
		return sysUserDao.getMaxSortByOrgNo(orgNo);
	}

	/**
	 * @desc 处理数据保存/更新
	 * @param param 前端传送的需要处理的数据
	 * @return 数据保存/更新结果
	 */
	@Override
	@Transactional(rollbackFor={RuntimeException.class, Exception.class, Throwable.class})
	public Integer doEdit(Map<String, Object> param) {
		Integer result = 0;
		SysUser sysUser = (SysUser) param.get(SysUser.class.getName());
		String userId = (String) param.get(ToolConstant.USER_TOKEN_ID);

		if (sysUser != null) {
			if (!StringUtils.isZero(sysUser.getId())) {
				preUpdate(sysUser, userId);
				result = sysUserDao.updateByPrimaryKeySelective(sysUser);
			} else {
				preInsert(sysUser, userId);
				result = sysUserDao.insertSelective(sysUser);
			}
		}
		return result;
	}

	/**
	 * @desc 根据ID串删除机构(同时还需要删除对应的角色-机构关联信息)
	 * @param ids 需要删除的详情信息ID串,多个ID之间用,分割
	 * @return 删除记录条数
	 */
	@Override
	@Transactional(rollbackFor={RuntimeException.class, Exception.class, Throwable.class})
	public Integer doDelete(String ids) {
		Integer result = 0;

		List<String> idList = StringUtils.toList(ids, ",");
		SysUser param = new SysUser(); 								// 删除方法的参数对象
		for(String id : idList) {
			param.setId(id); 										// 设置参数

			// 逻辑删除
			result += sysUserDao.deleteByDelFlag(param);
		}
		return result;
	}
}